package com.ihr360.payroll.service.reference;


import com.alibaba.fastjson.JSONObject;
import com.ihr360.expr.ExprException;
import com.ihr360.expr.core.Expr;
import com.ihr360.payroll.config.reference.ReferenceApplicationEntity;
import com.ihr360.payroll.config.reference.ReferencePropertyEntity;
import com.ihr360.payroll.config.reference.ReferenceServiceEntity;
import com.ihr360.payroll.entity.salary.AppliedToWrappers;

import java.util.List;

/**
 * 薪资引用项服务类
 *
 * @author richey
 */
public interface SalaryReferenceService {


    /**
     * 获取所有引用的服务
     */
    public List<ReferenceApplicationEntity> getAllReferenceApplication();


    /**
     * 获取所有引用实体
     */
    public List<ReferenceServiceEntity> getAllReferenceService();


    /**
     * 获取对应应用场景的引用实体
     *
     * @param applies
     * @return
     */
    public List<ReferenceServiceEntity> getReferenceService(AppliedToWrappers applies);


    /**
     * 获取所有引用属性
     */
    public List<ReferencePropertyEntity> getAllSystemReferenceProperty();


    /**
     * 获取某引用服务的所有引用实体
     *
     * @param refApplicationId 引用服务的id
     */
    public List<ReferenceServiceEntity> getReferenceApplicationServices(Long refApplicationId);

    /**
     * 获取某引用实体的所有引用属性
     *
     * @param refServiceId 引用实体的id
     */
    public List<ReferencePropertyEntity> getReferenceServiceProperties(Long refServiceId);


    /**
     * 根据公式字符串解析出Expr
     *
     * @param formular
     * @return
     */
    Expr getIdeographicExprByCodeFormular(String formular);

    /**
     * 将表意公式转换为code表示的公式
     *
     * @param ideographicFormula
     * @return
     */
    JSONObject parsedIdeographicToCodeFormula(String ideographicFormula) throws ExprException;

    /**
     * 将表意公式转换为code表示的公式,忽略给定变量
     *
     * @param ideographicFormula
     * @return
     */
    JSONObject parsedIdeographicToCodeFormula(String ideographicFormula, List<String> extraVariables) throws ExprException;


    /**
     * 将code表示的公式转换为文字表意的公式
     *
     * @param formular
     * @return
     */
    JSONObject parseCodeToIdeographicFormular(String formular);

    /**
     * 系统薪资字段文字表意公式循环依赖校验
     * @param ideographicFormular
     * @return
     */
    JSONObject ideographicCircularDependencyCheck(String code, String ideographicFormular);

    /**
     * 薪资表薪资字段循环依赖校验
     * @param code
     * @param ideographicFormular
     * @param payrollConfigId
     * @return
     */
    JSONObject payrollConfigDependencyCheck(String code, String ideographicFormular, Long payrollConfigId);

}
